#include<bits/stdc++.h>
using namespace std;
int n,a[200010],ans;
map<int,int>mp;
struct node{int x,y,z,v;};
queue<node>q; 
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	freopen("shung.in","r",stdin);
	freopen("shung.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	q.push({2,a[1],n,1});
	mp[2*n*n+a[1]*n+n-n*n-n-1]=1;
	q.push({2,1,a[1],1});
	mp[2*n*n+1*n+a[1]-n*n-n-1]=1;
	while(!q.empty()){
		node tmp=q.front();
		q.pop();
		tmp.v=mp[tmp.x*n*n+tmp.y*n+tmp.z-n*n-n-1];
		if(tmp.x==n+1)ans=max(ans,tmp.v);
		else{
			if(a[tmp.x]>=tmp.y){
				int X=tmp.x+1,Y=a[tmp.x],Z=tmp.z,V=tmp.v+1;
				int num=X*n*n+Y*n+Z-n*n-n-1;
				if(mp[num]==0)q.push({X,Y,Z,V});
				mp[num]=max(mp[num],V);
			}
			else{
				int num=(tmp.x+1)*n*n+tmp.y*n+tmp.z-n*n-n-1;
				if(mp[num]==0)q.push({tmp.x+1,tmp.y,tmp.z,tmp.v});
				mp[num]=max(mp[num],tmp.v);
			}
			if(a[tmp.x]<=tmp.z){
				int X=tmp.x+1,Y=tmp.y,Z=a[tmp.x],V=tmp.v+1;
				int num=X*n*n+Y*n+Z-n*n-n-1;
				if(mp[num]==0)q.push({X,Y,Z,V});
				mp[num]=max(mp[num],V);
			}
			else{
				int num=(tmp.x+1)*n*n+tmp.y*n+tmp.z-n*n-n-1;
				if(mp[num]==0)q.push({tmp.x+1,tmp.y,tmp.z,tmp.v});
				mp[num]=max(mp[num],tmp.v);
			}
		}
	}
	cout<<ans;
	return 0;
}
